package com.qf.utils;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolUtils {

    private ThreadPoolUtils(){}

    /**
     * 参数1：核心线程数    5
     * 参数2：最大线程数    10
     * 参数3：空闲线程销毁时间值   2
     * 参数4：空闲线程销毁的时间单位   s
     * 参数5：缓存队列   10
     * 参数6：线程工厂
     * 参数7：拒绝策略   报错拒绝
     *
     *  来3个任务，创建3个线程执行任务
     *  又来5个任务，创建2个线程执行任务，剩下的3个任务进入缓存队列等待执行
     *  又来10个任务，7个任务进入缓存队列等待，比对最大线程数是否有剩余，创建3个线程执行任务
     *  又来5个任务，2个任务创建线程执行，剩下3个拒绝
     *
     *  所有任务都执行完后，相比于核心线程数多出来的5个线程， 在等待2s后，没有任务执行，就会被回收
     *
     *  线程池的线程数如何取值：
     *      io密集型：（文件、数据库操作）：cpu核数+1
     *      cpu密集型：（普通计算）：2*cpu核数
     *
     *     在公司，核心线程数和最大线程数一般设置为相同，缓存队列设置为无界队列
     *
     */
    private static ThreadPoolExecutor threadPoolExecutor =
            new ThreadPoolExecutor(5,
                    5,
                    0,
                    TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(),
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy());

    public static ThreadPoolExecutor threadPoolExecutor(){
        return threadPoolExecutor;
    }
}
